<?php
namespace Pinenut\Log;

use Pinenut\Log;
/**
 * Логгер через плагин firebug + firephp (firefox)
 *
 */
class FirePHP extends Log {
	
	static protected $instance = null;
	static protected $_profileTables = [];
	
	static protected function getInstance() {
		if (null === static::$instance) {
			static::$instance = \FirePHP::getInstance(true);
		}
		return static::$instance;
	}
	
	static  function beginGroup($title = null) {
		if (\Application::isConsole())
			return;
		
		static::getInstance()->group(empty($title)?'Group':$title);
	}
	
	static  function endGroup(){
		if (\Application::isConsole())
			return;
		static::getInstance()->groupEnd();
	}
	
	static function commit($title, $data = null, $level = 'log', $file = "", $line = 0, $beginTime = null, $endTime = null) {
		if (\Application::isConsole ())
			return;
		$firephp = static::getInstance ();
		$options = array (
				'includeLineNumbers' => false 
		);
		
		$firephp->setOptions ( $options );
		
		// если указано время - добавляем его в заголовок
		if (null !== $beginTime && null !== $endTime) {
			$title .= ', ' . sprintf("%0.3f", ($endTime - $beginTime) * 1000) . ' ms';
		}
		
		switch ($level) {
			
			case 'info' :
				$firephp->info ( $data, $title, [ 
						'File' => $file,
						'Line' => $line 
				] );
				break;
			case 'warn' :
				$firephp->warn ( $data, $title, [ 
						'File' => $file,
						'Line' => $line 
				] );
				break;
			case 'error' :
				$firephp->error ( $data, $title, [ 
						'File' => $file,
						'Line' => $line 
				] );
				break;
			default :
				$firephp->log ( $data, $title, [ 
						'File' => $file,
						'Line' => $line 
				] );
		}
	}
	
	static protected function profile($group, $beginTime, $endTime, $title, $data = null, $level = 0) {
		// добавляем записи в профилирующие таблицы
		static::$_profileTables[$group][] = [$level, $title, $endTime-$beginTime, $data];
	}
	
	/**
	 * Упаковываем данные профилирования в таблицы и публикуем
	 */
	static function onFinish() {
		if (\Application::isConsole ())
			return;
		parent::onFinish();
		// формируем и выводим профилирующие таблицы
		$firephp = static::getInstance ();
		foreach (static::$_profileTables as $name=>$data) {
			$res = [['Title', 'Time, ms', 'Data']];
			$title = $name;
			$sum = 0;
			foreach ($data as $row) {
				// суммарное время считаем только для первого уровня
				if ($row[0] <= 1) {
					$sum += $row[2];
				}
				$res[] = [str_repeat(".", $row[0] -1) . $row[1], sprintf("%0.3f", $row[2] * 1000), $row[3]];
			}
			$title .= ', ' . sprintf("%0.3f", $sum * 1000) . ' ms, ' . count($data);
			$firephp->table($title, $res);
		}
	}
}
